﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Forms;
using wpfArVideo;
using System.Windows.Threading;
using System.Collections.ObjectModel;
using ModuloPartidas;
using JeremyBytes.StopWatch;


namespace wpfArVideo
{
    /// <summary>
    /// Interaction logic for IRanking.xaml
    /// </summary>
    public partial class IRanking : Window
    {
       ObservableCollection<GameRanking> _RankingCollection = 
        new ObservableCollection<GameRanking>();

       private wpfArVideo.ventanaInicio.interfazInicio inter;
       wpfArVideo.UserInterfaces.IPartidas inter2;
       private String nombrejugador, nombrepartida;
       
      

       public IRanking(String nombre_partida, String nj, wpfArVideo.ventanaInicio.interfazInicio i, wpfArVideo.UserInterfaces.IPartidas i2)
    {

        this.inter = i;
        this.inter2 = i2;
        this.nombrejugador = nj;
        this.nombrepartida = nombre_partida;
        
        
        
        ARBDDataContext bd = new ARBDDataContext();

        var q = from t in bd.participacions
                where t.Id_partida == nombre_partida
                orderby t.puntuacion, t.Usuario
                select t;

       List<GameRanking> l = new List<GameRanking>();

        foreach (participacion k in q)
        {
            int pf = puntuacionfinal((int) k.puntuacion, (int) k.tf_segundos);
            GameRanking g = new GameRanking
            {
                Posicion = "0",
                Nombre = k.Usuario,
                Puntuacion = k.puntuacion.ToString(),
                Tiempo = k.tiempo_final,
                PuntuacionFinal = pf.ToString()
            };
            l.Add(g);
            var q3 = from t in bd.participacions
                    where t.Usuario == this.nombrejugador
                    select t;
            participacion par = q3.First();
            par.terminado = "Si";
            bd.SubmitChanges();
           
        }

        var q2 = from p in l
                orderby p.PuntuacionFinal descending
                select p;
        int contador = 1;
        List<GameRanking>  l2 = q2.ToList<GameRanking>();
        foreach(GameRanking j in l2 ){
            j.Posicion = contador.ToString();
            _RankingCollection.Add(j);
            contador++;
            
        }
        
        DispatcherTimer dispatcherTimer = new DispatcherTimer();

        dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);

        dispatcherTimer.Interval = new TimeSpan(0, 0, 10);

        dispatcherTimer.Start();

     
       InitializeComponent();
       
    }

       private void dispatcherTimer_Tick(object sender, EventArgs e)
       {

           ARBDDataContext bd = new ARBDDataContext();

           _RankingCollection.Clear();
           var q = from t in bd.participacions
                   where t.Id_partida == this.nombrepartida
                   orderby t.puntuacion, t.Usuario
                   select t;

           List<GameRanking> l = new List<GameRanking>();

           foreach (participacion k in q)
           {
               int pf = puntuacionfinal((int)k.puntuacion, (int)k.tf_segundos);
               GameRanking g = new GameRanking
               {
                   Posicion = "0",
                   Nombre = k.Usuario,
                   Puntuacion = k.puntuacion.ToString(),
                   Tiempo = k.tiempo_final,
                   PuntuacionFinal = pf.ToString()
               };
               l.Add(g);

           }
           var q2 = from p in l
                    orderby p.PuntuacionFinal descending
                    select p;
           int contador = 1;
           List<GameRanking> l2 = q2.ToList<GameRanking>();
           foreach (GameRanking j in l2)
           {
               j.Posicion = contador.ToString();
               _RankingCollection.Add(j);
               contador++;

           }

       }
       private int puntuacionfinal(int p, int t)
       {
           if (t==0)
           {
               return p;
           }
           else if(t <=3600)
           {
               return p + 10;
           }else
           {
               int aux = (t - 3600) / 300;
               if (aux > 10)
               {
                   return p;
               }
               else
               {
                   return p + 10 - aux;
               }
           }
       }

    public ObservableCollection<GameRanking> RankingCollection
    { get { return _RankingCollection; } }

    private void Abandonar_Click(object sender, RoutedEventArgs e)
    {
        ARBDDataContext bd = new ARBDDataContext();

        bd = new ARBDDataContext();
        var q3 = from t in bd.participacions
                 where t.Id_partida == this.nombrepartida
                 select t;

        participacion par = q3.First();
        par.terminado = "Si";
        bd.SubmitChanges();
        bool terminados = true;
        foreach (participacion par1 in q3.ToList<participacion>())
        {

            if (par1.terminado == "No") terminados = false;


        }
        if (terminados)
        {


            Partida p = new Partida();
            p.borrarPartida(par.Id_partida);

            inter2.Show();
            inter2.clearParty(true);
            this.Close();
        }


    }
        
  }

  public class GameRanking
  {
    public string Posicion {get;set;}
    public string Nombre {get;set;}
    public string Puntuacion {get;set;}
    public string Tiempo {get;set;}
    public string PuntuacionFinal {get;set;}

  }


}

